/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ru.niir.goodfil.ui;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.richfaces.model.selection.SimpleSelection;
import ru.niir.goodfil.db.Client;
import ru.niir.goodfil.db.User;
import ru.niir.goodfil.exceptions.MailerException;
import ru.niir.goodfil.exceptions.GoodfilSecurityException;
import ru.niir.goodfil.utils.filters.ClientsFilter;
import ru.niir.goodfil.utils.filters.UsersFilter;


/**
 *
 * @author Носов А.В.
 */
public class CircularDispatchBean extends PageBean
{

    private static final Logger logger = Logger.getLogger(CircularDispatchBean.class);

    /**Список пользователей*/
    private UsersFilter usersFilter = new UsersFilter();
    private ClientsFilter clientsFilter = new ClientsFilter();
    private List<CircularTable> listUsers;
    /**Список пользователей добаленных для отправки им письма*/
    private List<CircularTable> listUsersAdded = new ArrayList<CircularTable>();
    /**Выделенный пользователь в таблице*/
    private SimpleSelection listUsersSelected = new SimpleSelection();
    /**Выделенный добаленный пользовател.*/
    private SimpleSelection listUsersAddedSelected = new SimpleSelection();
    /**Наименование клиента (для фильтра)*/
    private String clientName = "";
    /**Тема сообщения*/
    private String themeMessage;
    /**Текст сообщения*/
    private String textMessage;

    public CircularDispatchBean()
    {
        if (!getSecurityBean().getIsRoleAdministrator())
            throw new GoodfilSecurityException("Только администраторы имеют доступ к функции \"циркулярная рассылка\"");
    }

    /**
     * Возвращает список пользователей.
     * @return список пользователей
     */
    public List<CircularTable> getListUsers() {
        listUsers = new ArrayList<CircularTable>();
        if (getClientName().length() >= 3) {
            usersFilter.setFio(clientName);
            List<User> users = gf().getUsers(usersFilter);
            for (User user : users) {
                boolean b = true;
                for (CircularTable circularTable : listUsersAdded) {
                    Object obj = circularTable.getObject();
                    if (obj instanceof User) {
                        User u = (User) obj;
                        if (u.getId() == user.getId()) {
                            b = false;
                            break;
                        }
                    }
                }
                if (b) listUsers.add(new CircularTable(user, user.getFio()));
            }

            clientsFilter.setName(clientName);
            List<Client> clients = gf().getClients(0, Integer.MAX_VALUE, clientsFilter);
            for (Client client : clients) {
                boolean b = true;
                for (CircularTable circularTable : listUsersAdded) {
                    Object obj = circularTable.getObject();
                    if (obj instanceof Client) {
                        Client c = (Client) obj;
                        if (c.getId() == client.getId()) {
                            b = false;
                            break;
                        }
                    }
                }
                if (b) listUsers.add(new CircularTable(client, client.getCompanyName()));
            }
        }
        return listUsers;
    }

    /**
     * Возвращает список пользователей которых выделили для отправки им письма.
     * @return список пользователей
     */
    public List<CircularTable> getListUsersAdded() {
        return listUsersAdded;
    }

    /**
     * Устанавливает список пользователей которых выделил для отправки им письма.
     * @param PickListSelectedUser список пользователей
     */
    public void setListUsersAdded(List<CircularTable> listUsersAdded) {
        this.listUsersAdded = listUsersAdded;
    }

    /**
     * Возвращает пользователя выделенного в таблице для добаления к списку отправки.
     * @return пользователь
     */
    public SimpleSelection getListUsersSelected() {
        return listUsersSelected;
    }

    /**
     * Устанавливает пользователя выдленного в таблице для добавления к списку отправки.
     * @param selectPickListUser пользователь
     */
    public void setListUsersSelected(SimpleSelection selectPickListUser) {
        this.listUsersSelected = selectPickListUser;
    }

    /**
     * Возвращает пользователя выделенного в таблице для удаления его из списка отправки.
     * @return пользователь
     */
    public SimpleSelection getListUsersAddedSelected() {
        return listUsersAddedSelected;
    }

    /**
     * Устанавливает пользователя выделенного в талице для удаления его из списка отправки.
     * @param selectPickListSelectedUser пользователь
     */
    public void setListUsersAddedSelected(SimpleSelection listUsersAddedSelected) {
        this.listUsersAddedSelected = listUsersAddedSelected;
    }

    /**
     * Возвращает имя клиента.
     * @return имя клиента
     */
    public String getClientName() {
        return clientName;
    }

    /**
     * Устанавливает имя клиента.
     * @param clientName имя клиента
     */
    public void setClientName(String clientName) {
        this.clientName = clientName;
    }

    /**
     * Возвращает тему сообщения.
     * @return тема
     */
    public String getThemeMessage() {
        return themeMessage;
    }

    /**
     * Устанавливает тему сообщения.
     * @param themeMessage тема
     */
    public void setThemeMessage(String themeMessage) {
        this.themeMessage = themeMessage;
    }

    /**
     * Возвращает текст сообщения.
     * @return текст
     */
    public String getTextMessage() {
        return textMessage;
    }

    /**
     * Устанавливает текст сообщения.
     * @param textMessage текст
     */
    public void setTextMessage(String textMessage) {
        this.textMessage = textMessage;
    }

    /**
     * Добавление пользователя к списку отправки.
     * @param obj пользователь
     */
    public void addUserForListUsersAdded(Object obj) {
        if (obj instanceof User) {
            User user = (User) obj;
            listUsersAdded.add(new CircularTable(user, user.getFio()));
        } else if (obj instanceof Client) {
            Client client = (Client) obj;
            listUsersAdded.add(new CircularTable(client, client.getCompanyName()));
        }
    }

    /**
     * Удаление пользователя из списка отправки.
     * @param ct пользователь
     */
    public void removeUserForListUsersAdded(CircularTable ct) {
        listUsersAdded.remove(ct);
    }

    /**
     * Выбор одного пользователя для добаления к списку для отправки ему письма.
     * @return
     */
    public String addUser() {
        if (getListUsersSelected() == null) return null;
        Iterator<Object> iterator = getListUsersSelected().getKeys();
        while (iterator.hasNext()) {
            int key = Integer.valueOf(iterator.next().toString());
            if (listUsers.size() > 0) {
                CircularTable ct = listUsers.get(key);
                Object obj = ct.getObject();
                addUserForListUsersAdded(obj);
            }
        }
        return null;
    }

    /**
     * Выбор всех пользователей.
     * @return
     */
    public String addAllUsers() {
        if (getListUsersSelected() == null) return null;
        for (int i = 0; i < listUsers.size(); i++) {
            CircularTable ct = listUsers.get(i);
            Object obj = ct.getObject();
            addUserForListUsersAdded(obj);
        }
        return null;
    }

    /**
     * Удаление пользователя из списка отправки.
     * @return
     */
    public String removeUser() {
        if (getListUsersAddedSelected() == null) return null;
        Iterator<Object> iterator = getListUsersAddedSelected().getKeys();
        while (iterator.hasNext()){
            int key = Integer.valueOf(iterator.next().toString());
            if (listUsersAdded.size() > 0) {
                CircularTable ct = listUsersAdded.get(key);
                removeUserForListUsersAdded(ct);
            }
        }
        return null;
    }

    /**
     * Удаление всех пользователей из списка отправки.
     * @return
     */
    public String removeAllUsers() {
        listUsersAdded = new ArrayList<CircularTable>();
        return null;
    }

    /**
     * Отправка сообщения.
     */
    public void sendMessage() {

        //  Разделение прав пользователей ------------------------------------------------------------------------------
        //  Только администраторы могут использовать функцию "циркулярная рассылка"
        if (!getSecurityBean().getIsRoleAdministrator())
            throw new GoodfilSecurityException("Только администраторы имеют доступ к функции \"циркулярная рассылка\"");
        //  ------------------------------------------------------------------------------------------------------------

        themeMessage = themeMessage.trim();
        textMessage = textMessage.trim();
        if (themeMessage == null || themeMessage.equals("")) facesError("Тема сообщения должна быть заполнена");
        if (textMessage == null || textMessage.equals("")) facesError("Текст сообщения должен быть заполнен");
        if (listUsersAdded.size() < 1) facesError("Выберите ползователя(ей)");
        if (hasFacesErrors()) return;

        String email = null;
        CircularTable circularTable = null;
        for (int i = 0; i < listUsersAdded.size(); i++) {
            circularTable = listUsersAdded.get(i);
            Object obj = circularTable.getObject();
            if (obj instanceof Client) {
                Client client = (Client) obj;
                email = client.getContactEmail();
            } else if (obj instanceof User) {
                User user = (User) obj;
                email = user.getEmail();
            }
            
            assert !StringUtils.isEmpty(email);
            
            try {
                gf().sendEmailMsg(email, textMessage);
            } catch (MailerException ex) {
                logger.error(ex);
                ex.printStackTrace();
                facesError(ex.getError().getDescription());
            }
        }
        facesInfo("Сообщения поставленны в очереть на отправку");
        clientName = "";
        listUsersAdded = new ArrayList<CircularTable>();
        themeMessage = "";
        textMessage = "";
    }
}
